import { animation, AnimationClip, Sprite, SpriteFrame } from 'cc';
import ResourceManager from '../Runtime/ResourceManager';
import { sortSprintFrame } from '../Scripts/Utils';
import { StateMachine } from './StateMachine';


const ANIMATION_SPEED = 1 / 8
/**
 * 1.需要知道 animationClip
 * 2.需要具有播放动画能力 animation
 */
export default class State {
  private animationClip:AnimationClip

  constructor(
    private fsm: StateMachine,
    private path:string,
    private wrapMode : AnimationClip.WrapMode = AnimationClip.WrapMode.Normal
  ) {
    // 加载动画资源
    this.render()
  }
  /**
   * 加载动画资源
   */
  async render() {
    const promise =  ResourceManager.Instance.loadDir(this.path)
    // 将资源的异步操作，都放到 list 里
    this.fsm.waitingList.push(promise)
    const spriteFrames = await promise

    this.animationClip = new AnimationClip();
    const track  = new animation.ObjectTrack(); // 创建一个向量轨道
    track.path = new animation.TrackPath().toComponent(Sprite).toProperty('spriteFrame'); // 指定轨道路径，即指定目标对象为 "Foo" 子节点的 "position" 属性
    const frames :Array<[number, SpriteFrame]> = sortSprintFrame(spriteFrames).map((item, index) => [ANIMATION_SPEED * index, item])

    track.channel.curve.assignSorted(frames);

    // 最后将轨道添加到动画剪辑以应用
    this.animationClip.addTrack(track);
    this.animationClip.name = this.path
    this.animationClip.wrapMode = this.wrapMode // 循环播放
    this.animationClip.duration = frames.length * ANIMATION_SPEED //整个动画剪辑的周期
  }

  // state 的 run 方法 就是播放动画
  run() {
    this.fsm.animationComponent.defaultClip = this.animationClip
    this.fsm.animationComponent.play()
  }
}
